import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.util.jar.JarFile;

public class ImageFrame extends JFrame implements ActionListener {
    JMenuBar jmb = null;//定义菜单栏
    JMenu menu1,menu2;//定义两个菜单
    JMenuItem item11,item12,item21,item22;
    JSplitPane jsp;//定义分割面板
    JScrollPane jspz,jspy;//定义左右两个滚动面板
    JLabel jls,jlt;//定义两个标签，分别显示原始图像和处理后的图像。
    ImageIcon ii;

    public ImageFrame() throws HeadlessException {
        this.setSize(720,480);//设置窗口大小
        this.setLocationRelativeTo(null);//窗口居中
        this.setTitle("插入图像");
        initMenu();//初始化菜单
        initImagePanel();//分割面板
        this.setVisible(true);//显示窗口

    }
    private void initMenu(){
        jmb = new JMenuBar();//初始化菜单栏
        menu1 = new JMenu("File");//初始化文件菜单
        menu2 = new JMenu("Image Process");//初始化图像处理菜单
        item11 = new JMenuItem("Open Image");//初始化打开图像菜单
        item11.addActionListener(this);
        item12 = new JMenuItem("Save Image");//初始化保存图像菜单
        item12.addActionListener(this);
        item21 = new JMenuItem("Edge Detection");//初始化边缘检测菜单
        item21.addActionListener(this);
        item22 = new JMenuItem("Image Clipping");//初始化图像裁剪
        item22.addActionListener(this);
        menu1.add(item11);//将打开图像的菜单项添加到文件菜单中
        menu1.add(item12);//将保存图像的菜单项添加到文件菜单中
        menu2.add(item21);//将边缘检测的菜单项添加到图像处理的菜单之中
        menu2.add(item22);//将图象裁剪的菜单项添加到图象处理的菜单中
        jmb.add(menu1);//将文件菜单添加到菜单栏中。
        jmb.add(menu2);//将图像处理菜单添加到菜单栏中。
        this.setJMenuBar(jmb);//将设置菜单栏
    }

    private void initImagePanel(){
        jls = new JLabel();//初始化显示原始图像的标签
        jlt = new JLabel();//初始化显示目标图像的标签
        jspz = new JScrollPane(jls);//初始化左边面板，并将原始图像的标签放到左边面板中
        jspy = new JScrollPane(jlt);//初始化右边面板。
        jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jspz,jspy);//初始化分割窗口，水平分割
        jsp.setDividerLocation(348);//设置分割线的位置
        jsp.setDividerSize(3);//设置分割线宽度
        this.add(jsp,BorderLayout.CENTER);//将分割面板放到窗口中
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==item11)
        {
            openImage();//调用打开图片的函数
        }else if(e.getSource() == item21){
            edgeDetect();//调用边缘检测的函数
        }else if (e.getSource() == item22){
            cutImage();//调用图像裁剪函数
        }
    }

    private void cutImage() {
        if(ii==null||ii.equals("")){//如果没有打开图像，就无法进行边缘检测
            JOptionPane.showMessageDialog(null,"请先打开一幅图像");
            return;
        }
        new CutImageFrame(ii.getImage());
    }

    private void edgeDetect(){
        if(ii==null||ii.equals("")){//如果没有打开图像，就无法进行边缘检测
            JOptionPane.showMessageDialog(null,"请先打开一幅图像");
            return;
        }
        int width = ii.getImage().getWidth(null);//获取图标的图像，再获取图像的宽度
        int height = ii.getImage().getHeight(null);//获取图像的高度
        BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);//定义图像缓冲区，用来临时存储图像，以便对图像进行操作
        Graphics g = bi.getGraphics();//获取h缓冲区的图形对象
        g.drawImage(ii.getImage(),0,0,null);//将原始图像绘制到图形缓冲区中
        BufferedImage bimg = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);//定义图像缓冲区，用来存储处理好的图像
        float []data = {0.0f,-1.0f,0.0f,
                       -1.0f,4.0f,-1.0f,
                        0.0f,-1.0f,0.0f};//边缘检测的算子
        Kernel kernel = new Kernel(3,3,data);//定义边缘检测的核
        ConvolveOp cop = new ConvolveOp(kernel,ConvolveOp.EDGE_ZERO_FILL,null);//定义一个卷积操作
        cop.filter(bi,bimg);//对原始图像进行j卷积操作，并把结果放在bimg里面
        Graphics g1 = bimg.getGraphics();
        g1.drawLine(0,0,100,100);
        g1.drawString("这是边缘检测的结果",100,100);
        jlt.setIcon(new ImageIcon(bimg));//显示图像，先转换为图标，显示在标签中。
    }

    private void openImage() {
        JFileChooser jfc = new JFileChooser();//新建一个文件选择对话框的按钮
        FileNameExtensionFilter filter = new FileNameExtensionFilter("*.jpg","jpg");
        jfc.setFileFilter(filter);
        jfc.showOpenDialog(this);//显示目标对话框。
        File file = jfc.getSelectedFile();//获取文件
        if(file.exists()){//判断文件是否存在
            String path = file.getPath();//获取文件路径
            ii= new ImageIcon(path);//初始化图标，将磁盘中的图像导入内存欸
            jls.setIcon(ii);//将图像显示在原始图像的标签上
        }
    }
}
